﻿#ifndef   MY_PUBLIC_MACRO_H
#define  MY_PUBLIC_MACRO_H

#include <string>
#include "GameSkeletonMsgCode.h"

#pragma pack(push,1)

#define MAX_PLAYER_COUNT					6	 //每桌最大人数

enum // 游戏系统的状态
{
	GAME_SYS_STATE_NO = 0,	// 游戏未开始
	GAME_SYS_STATE_RUNING,	// 游戏进行中
	GAME_SYS_STATE_PAUSH,	// 游戏冻结，即暂停
};

enum  // 游戏开始的类型
{
	GAME_BEGIN_TYPE_AUTO = 0,	// 不管有无人坐下都会自动开始
	GAME_BEGIN_TYPE_ONLY_ONE,// 只要有一个坐下就开始
	GAME_BEGIN_TYPE_ALL_SIT,// 全都坐下才开始
	GAME_BEGIN_TYPE_ANY,// 座位数量内的任意几个人都可以开打，比如2个人也可以打，三个人也可以打
};

enum USER_STATE	// 用户状态
{
	US_OFFLINE = 0,		// 离线，不在房间里
	US_ONLINE_LEAVE_SIT = 10,		// 在线，在房间里，但离座
	US_ONLINE_SITDOWN = 20,		// 在线，在房间里，在坐，但没举手
	US_ONLINE_SITDOWN_RAISE = 30,		// 在线,在房间里，在坐，已举手
	US_ONLINE_PLAYLING = 40,		// 在游戏中
	US_WAIT_RECONNECT = 50,		// 断线后等待重入
	US_LEAVE_ENTER_TRUST = 60,		// 玩家主动离开进入托管状态
};

enum //桌子类型  
{
	E_TABLE_TYPE_NULL = 0,//没有类型
	E_TABLE_TYPE_1 = 1,//1--小型桌，
	E_TABLE_TYPE_2,//2--中型桌
	E_TABLE_TYPE_3,//3--大型桌
	E_TABLE_TYPE_4, //4--特大型桌
};

#define INVALID_USER_ID -1		// 无效用户Id
#define INVAL_ROOM_ID -1		// 无效房间
#define INVAL_TABLE_NO -1		// 无效桌子
#define INVAL_SEAT_NO -1		// 无效座号

#define IP_ADDRES_LEN 20		// IP地址的长度
#define STR_20_LEN 20		// 20个长度 
#define STR_30_LEN 30		// 30个长度
#define STR_40_LEN 40		// 40个长度
#define STR_50_LEN 50		// 50个长度
#define STR_100_LEN 100		// 100个长度

#define USER_NAME_LEN 33		// 是 CHAR 
#define USER_PASSWORD_LEN  33	// 是 BYTE 
#define USER_REAL_NAME_LEN 16	// 直实姓名的长度，是 CHAR 
#define USER_IDENTITY_CARD_LEN 20	// 身份证号码的长度
#define USER_MOBILE_LEN 16			// 手机号长度
#define USER_SIGNATURE		256		// 个人签名
#define USER_FAVORITE		256		// 兴趣爱好
#define USER_EXPLAIN		256		// 个人说明

#define	DB_NAME_LEN			20		// 房间相连的只读数据库名称，通常是 six_devisions
#define	DB_USER_NAME_LEN	20		// 房间相连的只读数据库用户名称，通常是 root
#define	DB_PASS_LEN			20		// 房间相连的只读数据库密码

#define ROOM_NAME_LEN			30	// 房间名称的长度，是 char 
#define FIGHT_TABLE_NAME_LEN	30	// 战斗表名的长度，是 char 
#define ROOM_MESSAGE_LEN	   100	// 玩家进入房间时会收到的消息的长度
#define GAME_MESSAGE_LEN       100  // 玩家进入游戏时会收到的消息的长度

#define PARAMETER_KEY_VALUE1_LEN 30		// parameter表中的key_value的长度
#define GAME_NAME_LEN			32		// 游戏名字长度
#define PROGRESS_NAME_LEN		32		// 游戏进程名字长度
#define REWARD_NAME_LEN			32		// 奖励名称长度
#define ACCOUNTS_LEN			16		// 管理员帐号长度
#define CHAT_CONTENT_LEN		256		// 聊天内容长度
#define MACHINE_CODE_LEN		33		// 机器编号长度
#define GRADE_TITLE_LEN			16		// 等级称号

#define TASK_NAME_LEN			64		// 任务名字长度
#define FILE_NAME_LEN			64		// 文件名字长度
#define ACTIVITY_NAME_LEN		33		// 活动名字长度
#define DESCRIPTION_LEN			256		// 描述长度
#define TABLE_PASSWORD_LEN		8		// 桌子密码
#define USER_RECORD_CONTENT_LEN 100		// 用户邮件消息记录的内容长度

#define PAY_CONTEXT_LEN			64		// 充值(包名长度)
#define PAY_SUBJECT_LEN			32		// 充值(商品名称)
#define PAY_SECRET_KEY_LEN		32		// 充值(生成密钥)
#define PAY_MCH_NAME_LEN		32		// 充值(商户签约名长度)
#define PAY_NOTIFY_URL_LEN		255		// 充值(回单URL（用于接收支付平台充值结果消息）)长度

#define POINT_ORDERID_LEN		32		// 点卡充值订单号
#define RESULT_TEXT_LEN			64		// 返回文本长度

#define TRAJECTORY_CONTENT_LEN	256		// trajectory表中的content长度	// version: 20140506
#define TRAJECTORY_DESCRIBES_LEN 64		// trajectory表中的describes长度
#define TRAJECTORY_RET_MULT_LEN 32		// trajectory表中的RET_MULT长度
#define TRAJECTORY_CARD_TYPE_NUM_LEN	128		// trajectory表中的card_type_num长度
#define OPERATION_LOG_CONTENTLEN 256		// operation_log表中的content长度

#define PAY_GOODS_MARK_LEN		64		// 商品标识符

#define URL_LEN	256					// 网址字符串最大长度

// #ifdef WIN32
// struct __declspec(dllexport) EASY_DATA_TIME
// #else
struct EASY_DATA_TIME
//#endif
{
	EASY_DATA_TIME(){ memset(this, 0, sizeof(*this)); }

	int iYear;
	int iMon;
	int iDay;
	int iHour;
	int iMin;
	int iSec;
};

// 用户登录
struct CMD_CS_UserLogin
{
	CMD_CS_UserLogin()
	{
		memset(this, 0, sizeof(*this));
	}
	int			iVersion;								// 版本号
	int			iAppId;									// 游戏AppID(捕鱼=1; 三公=2; 估计牛牛是=5;)
	char		szName[33];								// 帐号
	char		szPwd[33];								// 密码
	char		szIp[20];								// IP地址(服务器用)
	int			iTrenchId;								// 渠道【推广公司：比如腾讯，360，安桌市场等等】(0:本公司; )渠道增加把注释也加上。
	int			iPlatformNo;							// 1=手机;2=PC;3=网页;
	char		szMachineCode[33];						// 机器序列号
	char        szCellPhone[20];						// 手机电话

	char		szData[48];								// 保留48个字节
};

// 用户登录成功
struct CMD_SC_UserLoginInfo
{
	CMD_SC_UserLoginInfo()
	{
		memset(this, 0, sizeof(*this));
		iRet = -1;
	}
	int				iRet;								// 返回状态(0:成功;1:)
	LONGLONG		llUserID;							// 用户ID
	LONGLONG		llGold;								// 金币
	LONGLONG		llExperienceGold;					// 体验币
	LONGLONG		llPoint;							// 积分
	char			szName[USER_NAME_LEN];				// 帐号
	char			szNickName[USER_NAME_LEN];			// 用户呢称
	int				iSex;								// 性别
	LONGLONG		lSysLogoID;							// 头像ID
	LONGLONG		lExperience;						// 经验值
	int				iWinCount;							// 赢总数
	int				iLostCount;							// 输总数
	long long		lRevenue;							// 收税
	char			szIdCardNo[USER_IDENTITY_CARD_LEN];	// 身份证号码
	char			szIdCardName[USER_REAL_NAME_LEN];	// 身份证名字
	EASY_DATA_TIME	dtForbidEnterTime;					// 禁止进入时间
	int				iMaxWinGold;						// 最大赢取金币
	long long		lMaxCardData;						// 最大牌型数据
	int				iAgentId;							// 代理ID(6位数字)
	char        szCellPhone[STR_20_LEN];                // 手机电话
	char			szResText[RESULT_TEXT_LEN];			// 返回内容说明
	int				nRecommendCode;						// 推荐码
};

// 登录错误
struct CMD_SC_UserLoginFail
{
	CMD_SC_UserLoginFail()
	{
		memset(this,0,sizeof(*this));
	}
	int				iRet;								// 返回状态(0:成功;!0:失败)
	char			szResText[RESULT_TEXT_LEN];			// 返回内容说明
};

//登陆游戏服出错
struct LOGIN_ROOM_FAIL
{
	enum
	{
		ERR_CAN_NOT_LOGIN = 10,	// 房间禁止登录状态
		ERR_01 = 20,				// 用户名与密码不符，或不存在该用户
		ERR_02 = 30,				// 用户名不唯一
		ERR_30 = 40,				// 服务骨骼增加用户失败
		ERR_FORBID_ENTER_TIME = 50,	// 禁止进入
		ERR_ROOM_FULL = 60,			// 房间已经满了
		ERR_ZHZT_STOP = 70,			// 账号停用
		ERR_CAN_NOT_BET = 80,		// 账号停押状态
		ERR_90 = 90,//黑盒子系统维护状态.
	};

	LOGIN_ROOM_FAIL() { memset(this, 0, sizeof(*this)); }

	int	 iErrCode;	// 若登录是成功，返回0值。
					// 若是登录失败，返回非0值的错误码如下：
	EASY_DATA_TIME dtForbidEnterTime;
	char szRetText[RESULT_TEXT_LEN];// 返回文本
};

// 房间列表
struct CMD_SC_RoomList
{
	CMD_SC_RoomList()
	{
		memset(this, 0, sizeof(*this));
	}
	long long		lParentId;							// 父节点（关卡 1:初级场;2:中级场....）..
	int				iGameID;							// 游戏ID(比如：1捕鱼; 2斗地主; 3麻将...)
	int				iRoomType;							// 游戏类型(1=积分房间、2=金币游戏、3=比赛游戏)..
	int				iRoomId;							// 房间ID
	long long		lRoomTeltComIp;						// 房间的中国电信IP
	long long 		lRoomUnicomIp;						// 房间的中国联通IP
	long long		lRoomMobileIp;						// 房间的中国移动IP
	int				iRoomPort;							// 房间端口
	char			szRoomName[ROOM_NAME_LEN];			// 房间名字
	bool			bAutoSit;							// 是否自动入座(0:不自动，需要手动点坐桌和椅子进入; 1:自动入座，不需要点击椅子号)
	int				iBasePoint;							// 倍率..
	int				iDoorsill;							// 进入门槛(自身金币少于门槛不能进入房间)..
	long long		lMaxDoorsill;						// 最高进入门槛(自身金币少于门槛不能进入房间)..
	int				iTables;							// 房内桌子的数量
	int				iSeatNum;							// 每桌人数，即每桌的座位数量
	int				iEnterTradeGold;					// 报名费(金币)
	int				iEnterTradePoint;					// 报名费(积分)
	int				iRewardGold1;						// 第一名奖励
	int				iRewardGold2;						// 第二名奖励
	int				iPlayerCount;						// 游戏人数
	int				iApplyBankerMinGold;				// 最小上庄金币
	int				iMostToLostMoney;					// 房间最大输钱数
	int				iParm17;							// 庄家本身最少有【x%】金币，才能限制下注，
	int				iParm22;							// 下庄上限【庄家低于x值，系统会自动踢庄家下庄】
	int				iParm23;							// 否是有倍率的房间:(0:没有高倍率,全是1倍. 1:有倍率, 三公是3倍..)
	int				iRevenueRate;						// 房间收税比率
	int             iMaxBetLimit;                       //下注最大限宏    
};

// 坐下
struct SITDOWN
{
	enum
	{
		ERR_CAN_NOT_BEGIN = 1000,		// 不能开始游戏
		ERR_CAN_NOT_SIT_DOWN = 1010,	// 房间禁止坐下状态
		ERR_TABLE_CAN_ENTER = 1020,	// 房间桌子所属等级禁止登陆	 // @xxye add
	};

	SITDOWN()
	{
		memset(this, 0, sizeof(*this));
		lUserId = INVALID_USER_ID;
		iTableNo = INVAL_TABLE_NO;
		iSeatNo = INVAL_SEAT_NO;
		lGameSysState = GAME_SYS_STATE_NO;
		iTableGradeType = -1;
		stUserState = US_OFFLINE;
		idesk_type = E_TABLE_TYPE_NULL;
	}

	long long lUserId;

	int iTableNo;	// 桌号
	int iSeatNo;	// 座位号
	int iRes;		// 结果值
	char szTablePwd[TABLE_PASSWORD_LEN];	// 桌子密码
	int lGameSysState; // 游戏系统的状态，参考 GAME_SYS_STATE_NO 等
	//add by Ivan_han 20130713
	long long	lGoldLogin;		// 登录时的金币值
	long long	lPointLogin;	// 登录时的积分
	long long	lExp;			// 经验

	// @xxye add
	int         iTableGradeType;	// 桌子等级 
	// @xxye end
	USER_STATE stUserState; // 用户状态
	long long	 lExperienceGoldLogin;				    // 登录时的体验币值
	short idesk_type;////'1--小型桌，2--中型桌, 3--大型桌,4--特大型桌'
};

// 登录房间
struct LOGIN_ROOM
{
	LOGIN_ROOM()
	{
		memset(this, 0, sizeof(*this));
	}
	long long lUserID;
	char szName[USER_NAME_LEN];			// 用户名
	char szPassword[USER_PASSWORD_LEN];	// 加密后的密码，例如用 MD5 加密后不可逆的密码
	char szData[48];	//保留48个字节
};

// 客户端的用户信息
struct USER_INFO_SIM
{
	USER_INFO_SIM()
	{
		memset(this, 0, sizeof(*this));
		lUserId = INVALID_USER_ID;
		iTableNo = INVAL_TABLE_NO;
		iSeatNo = INVAL_SEAT_NO;
	}

	long long	lUserId;						// 用户ID
	char		szName[USER_NAME_LEN];			// 用户帐号即登录名称
	char		szNickname[USER_NAME_LEN];		// 昵称
	char		szPassword[USER_PASSWORD_LEN];	// 登录密码，MD5 后的值
	int			iSex;							// 性别：0男性、1女性

	long long	lIdentity;						// 玩家的身份：0:普通用户;1:散仙;2:GM管理权限;4:PC后台管理权限;8:机器人;16:可以编辑聊天语句(充值决定)
	int         iIdentityTactics;               // 身份策略(0普通; 1通杀;2通赔;3杀大赔小)
	long long	lMasterPower;					// 管理权限（是掩码）：允许发警告消息、允许发游戏信息、禁止其他人游戏、踢玩家下线、允许加减分数、禁止进入银行 等
	long long	lGamePower;						// 玩家游戏权限（是掩码）：允许游戏聊天、允许发短信息、许任何旁观 等
	long long	lSysLogoID;						// 系统提供的头像系列。
	long long	lExperience;					// 经验值
	long long	lGoldLogin;						// 登录时的金币值
	long long	lExperienceGoldLogin;			// 登录时的体验币值
	long long	lPointLogin;					// 登录时的积分
	int			iTableNo;						// 桌号
	int			iSeatNo;						// 座位号
	USER_STATE	stUserState;					// 用户状态
	int			iWinCount;						// 赢数量
	int			iLostCount;						// 输数量
	// @xxye add
	int					iZhzt;									// 帐号状态(启用，停用)
	int					iTyzt;									// 停押状态
	// @xxye end
	int                 iagent_code;                            //玩家的代理商 id
	long long           lLoginGiveGold;                         // 游客登录房间不够金币时的赠送.
};

// 登录房间成功
struct LOGIN_ROOM_SUCC
{
	LOGIN_ROOM_SUCC()
	{
		memset(this, 0, sizeof(*this));
		bAlreadyInRoom = false;
	}

	// 可以安排一些房间的信息

	char szIP[IP_ADDRES_LEN];	// 房间服的IP
	int	 iPort;					// 房间服的端口
	bool bAlreadyInRoom;		// 已经在房间里啦
	USER_INFO_SIM userInfo;	// 用户信
};

// 房间信息简化信息
struct SERVER_ROOM_INFO_SIM
{
	SERVER_ROOM_INFO_SIM()
	{
		memset(this, 0, sizeof(*this));
	}
	long long	lParentId;					// 父节点ID，通常用于树型组件的定位
	int			iRoomId;					// 房间ID，是唯一的。注意前 100 的值归系统内部使用
	int			iRoomType;					// 游戏类型: 1=积分房间、2=金币游戏、3=比赛游戏、4=测试类游戏。
	int			iBasePoint;					// 倍频，10倍区、50倍区、100倍区
	long long	lRoomRule;					// 房间规则，如会员房间、地址限制、允许旁观、自动坐下、限制座位、限制同IP(暂时没用上)
	char		szRoomName[ROOM_NAME_LEN];	// 房间名称
	int			iTables;					// 房内桌子的数量
	int			iSeatNum;					// 每桌人数，即每桌的座位数量
	int			iRoomPeopleCount;			// 房间人数

	int			iRevenueRate;				// 房间收税比率
	int			iExpRadix;					// 经验基数
	int			iApplyBankerMinGold;		// 最小上庄金币
	int			iParm17;					// 庄家本身最少有【x%】金币，才能限制下注，
};

//用于启动时获取每个桌子的信息
struct CMD_EveryTableInfo
{
	CMD_EveryTableInfo()
	{
		memset(this, 0, sizeof(*this));
		iTableNo = INVAL_TABLE_NO;
	}
	int           iGameId;					// 游戏id 
	int           iRoomId;					// 房间号
	int			  iTableNo;					// 桌子号.
	int           iTalbeOrder;              //桌子在客户端的显示顺序 
	char	      szPara1[STR_50_LEN]; //参数1
	char	      szPara2[STR_50_LEN]; //参数2
	char	      szPara3[STR_50_LEN]; //参数3
	char	      szPara4[STR_50_LEN]; //参数4
	char	      szPara5[STR_50_LEN]; //参数5
	char	      szPara6[STR_50_LEN]; //参数6
	char	      szPara7[STR_50_LEN]; //参数7
	char	      szPara8[STR_50_LEN]; //参数8
	char	      szPara9[STR_50_LEN]; //参数9
	char	      szPara10[STR_50_LEN]; //参数10
	char	      szPara11[STR_50_LEN]; //参数11
	char	      szPara12[STR_50_LEN]; //参数12
	char	      szPara13[STR_50_LEN]; //参数13
	char	      szPara14[STR_50_LEN]; //参数14
	char	      szPara15[STR_50_LEN]; //参数15
	char	      szPara16[STR_50_LEN]; //参数16
	char	      szPara17[STR_50_LEN]; //参数17
	char	      szPara18[STR_50_LEN]; //参数18
	char	      szPara19[STR_50_LEN]; //参数19
	char	      szPara20[STR_50_LEN]; //参数20 
};

//申请选卓信息
struct CMD_Get_SelectionTableInfo
{
	CMD_Get_SelectionTableInfo()
	{
		memset(this, 0, sizeof(*this));
	}
	int iGameId;		  // 游戏id
	int iTableNo;		  // 桌号
	int iRoomId;		  // 房间号
	long long	lUserId;  // 用户 
};

// 房间桌子信息
struct CMD_TableGradeInfo
{
	CMD_TableGradeInfo() { memset(this, 0, sizeof(*this)); }
	int  id;						//房间内桌子等级id
	int iTableGradeType;	//桌子等级名字初级中级高级
	int iRoomId;				//房间ID
	int iTableCount;			//房间桌子数
	long long lMinGold;			//最小下注额
	long long lMidGold;
	long long lMaxGold;			//最大下注额
	long long lLimitRedGold;		//限红 龙虎 下注差，每个等级不同
	long long lDoorSill;

	int  iCanEnter;				// 1允许进入
	int  iAutoOpen;				// 1启用自动开启
	EASY_DATA_TIME dtAutoOpenTime;  // 自动开始时间
	int  iAutoClose;				// 启用自动关闭
	EASY_DATA_TIME dtAutoCloseTime;	// 自动关闭时间

};

// 选座位时，每个座位的情况
struct  CMD_SelectionSeat
{
	enum
	{
		ERR_CAN_NOT_BEGIN = 1000,		// 不能开始游戏
		ERR_CAN_NOT_SIT_DOWN = 1010,	// 房间禁止坐下状态
		ERR_TABLE_CAN_ENTER = 1020,	// 房间桌子所属等级禁止登陆	 // @xxye add
	};
	CMD_SelectionSeat()
	{
		memset(this, 0, sizeof(*this));
		lUserId = INVALID_USER_ID;
		iSeatNo = INVAL_SEAT_NO;
		stUserState = US_OFFLINE;
	}
	void Init()
	{
		lUserId = INVALID_USER_ID;
		iSeatNo = INVAL_SEAT_NO;
		stUserState = US_OFFLINE;
	}
	int         iSeatNo;	 // 座位号 
	long long   lUserId;     // 玩家账号
	long long	lGoldLogin;	 // 登录时的金币值
	long long	lPointLogin; // 登录时的积分
	long long	lExp;		 // 经验  
	long long	lSysLogoID;	 // 系统提供的头像系列。
	USER_STATE stUserState;  // 用户状态
	long long	 lExperienceGoldLogin;				    // 登录时的体验币值
};

//选座位时，的桌子情况 
struct  CMD_SelectionTable
{
	CMD_SelectionTable()
	{
		memset(this, 0, sizeof(*this));
		iTableNo = INVAL_TABLE_NO;
		iTableGradeType = -1;
		lGameSysState = GAME_SYS_STATE_NO;
		for (int i = 0; i < MAX_PLAYER_COUNT; ++i)
		{
			stSeat[i].Init();
		}
	}

	int           iGameId;					// 游戏id 
	int           iRoomId;					// 房间号
	int			  iTableNo;					// 桌子号.
	long long     lCreateTableUserId;	    // 创建桌子用户
	bool		  bFriendEnter;				// 是否只允许房主好友进入(false=所有玩家都可以进入; true=创建者的好友才能进入) 
	int		      iTableGradeType;			// 桌子等级 
	long		  lGameSysState;            // 游戏系统的状态，参考 GAME_SYS_STATE_NO 等 
	CMD_SelectionSeat stSeat[MAX_PLAYER_COUNT]; // 每个座位的情况.
};

// 离座
struct LEAVE_SEAT
{
	LEAVE_SEAT(long long UserId = INVALID_USER_ID, int TableNo = INVAL_TABLE_NO, int SeatNo = INVAL_SEAT_NO)
	{
		memset(this, 0, sizeof(*this));
		lUserId = UserId;
		iTableNo = TableNo;
		iSeatNo = SeatNo;
	}

	long long lUserId;

	int iTableNo;	// 桌号
	int iSeatNo;	// 座位号
	int iRes;
};

#define MAIN_MSG_LOGIN								2000		// 用户登录主消息
#define SUB_CS_USER_LOGIN_SELECT_GAME_SRV			2107		// 用户登录 选择房间服务器
#define SUB_SC_USER_LOGIN_SELECT_GAME_SRV_SUC		2108		// 用户登录 选择房间服务器 成功
#define SUB_SC_USER_LOGIN_SELECT_GAME_SRV_FINISH	2109		// 用户登录 选择房间服务器 完成
#define SUB_CS_USER_LOGIN_SELECT_GAME_SRV_FAIL		2110		// 用户登录 选择房间服务器 失败

#define SUB_CSG_GAME_ROOM_LIST						2015		// 房间列表
#define SUB_SC_GAME_ROOM_LIST_SEDN_FINISH			2016		// 房间列表发送完成
#define SUB_CSG_PLAZA_LIST							2017		// 大厅列表
#define SUB_SG_VERSION_REEOR						2018		// 版本错误
#define SUB_CSG_SELECT_GAME_SRV_LIST				2019		//选择房间服务器 列表

#define MAIN_MSG_USER								5600		// 用户
#define SUB_SC_USER_KICKOUT							5624		// 用户被挤出大厅服务器
#define SUB_SC_USER_KICKOUT_OVER_BURST				5656		// 超过了爆机值.


#define MAIN_MSG_BLACK_BOX							6600        //黑盒子消息
#define SUB_SC_USER_KICKOUT_BY_BLACKBOX				6601		// 黑盒子系统踢掉所有用户 出大厅服务器
#define SUB_SS_GET_MAINTENANCE_STAFF_INFO			6602        // 在服务器在维护状态的时候，用维护人员账号，可以正常进入


#ifdef WIN32
#pragma pack(pop)
#else
#pragma pack()
#endif



#endif
